'''
@since: 21.03.2014

@author: Max

@summary: Diese Klasse ist verantwortlich fuer jeglichen Input (Keyboard, Mouse)
'''

import pygame

from ErrorCodes import *    # @UnusedWildImport
from Messages import *    # @UnusedWildImport
from Properties import *    # @UnusedWildImport
from gfx.Tile import *

class InputSystem(object):
    def __init__(self, gLogic, mapObj, hud):
        self.event = None
        """@ivar: Event-Handler"""
        
        self.gLogic = gLogic
        """@ivar: Game-Logic Referenz"""
        
        self.map = mapObj
        """@ivar: Map-Referenz"""
        
        self.hud = hud
        """@ivar: HUD-Referenz"""
        
        self.selected = None
        """@ivar: Ausgewaehltes Tile vom HUD"""
        
    def inputHandling(self, event):
        """ Diese Funktion verteilt die events auf die einzelnen Unterfunktionen """
        for evt in event:
            if evt.type == pygame.QUIT:
                self.gLogic.endGame(CODE_0x0)
            if evt.type == pygame.KEYDOWN:
                self.keyMapping()
            if evt.type == pygame.MOUSEMOTION or evt.type == pygame.MOUSEBUTTONDOWN:
                self.mouseMapping(evt)
            
    def keyMapping(self):
        """
        Diese Funktion legt fuer die Keyboard-Tasten verschiedene Funktionalitaeten fest.
        """
        keys = pygame.key.get_pressed()
        
        if keys[pygame.K_ESCAPE]:
            self.gLogic.endGame(CODE_0x0)
             
            
    def mouseMapping(self, evt):
        """
        Diese Funktion legt fuer die Maus-Tasten und -Bewegungen verschiedene Funktionalitaeten fest.
        @param evt: Event, welches von inputHandling uebergeben wird.
        @todo: Drag'n'Drop, Da wo schon eine Wand ist, kann man nichts mehr bauen.
        """ 
        
        mouse = pygame.mouse.get_pressed()
        
        if mouse[0]:
            bInHud, elem = self.hud.isInHud(evt.pos)
            if bInHud:
                self.selected = elem
                self.hud.selectedInfoText = TILE_SELECTED + str(self.selected.id)
            else:                                    
                if evt.pos[0] > self.map.x + MAP_WIDTH or evt.pos[0] < self.map.x or evt.pos[1] > self.map.y + MAP_HEIGHT or evt.pos[1] < self.map.y:
                    print(MAP_OOB)
                else:
                    if self.selected is not None:
                        self.map.addProp(evt.pos, self.selected)
                        
        if mouse[2]:
            self.selected = None
            self.hud.selectedInfoText = TILE_NOTHING_SELECTED
            
        if mouse[1]:
            # self.map.delProp(evt.pos)
            self.map.worker.astar()
            
    def update(self, evt):
        """
        Ruft inputHandling auf
        """
        self.inputHandling(evt)
            
